# Написать программу, которая вводит вещественное число -π/2 ⩽ x ⩽ π/2, затем — неотрицательное целое n ⩽ 9 и вычисляет sin(x) с точностью n знаков после запятой,
# а остальные цифры отбрасывает (можно воспользоваться подпрограммой из ../Homework_DoubleTrunc). Синус удобно вычислять с помощью ряда Тейлора. Использовать двойную точность. 


.data
one:    .double	1

.text
Begin:
        li	a7, 7
	ecall
        li	a7,  5
	ecall
        bgez	a0,  .notneg
	neg	a0,  a0
.notneg:
	
	mv	a1, a0		# Для вычисления точности
	fld	fs1 one t0	# Это 1

	fmv.d   fs0 fa0		# Это sin(x), пока x
	fmv.d   fs4 fs1         # Здесь будет (-1)**n, пока 1
	fmv.d   fs7 fa0		# Это x**(2n+1), пока x
        fmv.d	fs2 fs1         # Это текущее 2*n+1, пока 1
 	fmv.d   fs6 fs1         # Здесь будет (2*n+1)!, пока 1
        
.loop:  fneg.d	fs4 fs4
	fmul.d	fs7 fs7 fa0	# x**(2n+1)
	fmul.d	fs7 fs7 fa0
	fadd.d  fs2 fs2 fs1     # (2*n+1)!
        fmul.d  fs6 fs6 fs2
        fadd.d  fs2 fs2 fs1
        fmul.d  fs6 fs6 fs2
        
        fmul.d  ft0 fs7 fs4	# (-1)**n*x**(2n+1)/(2n+1)!
        fdiv.d  ft0 ft0 fs6
        fadd.d  fs0 fs0 ft0     # sin(x) += (-1)**n*x**(2n+1)/(2n+1)!
        addi	a1 a1 -1
        bgez    a1 .loop

	fmv.d   fa0 fs0
	jal	Round
        li      a7,  3			# Выведем результат
        ecall
.exit:  li      a7, 10
        ecall

	
Round:	
	addi    sp,  sp, -4
        sw      ra,  (sp)
        fmv.d	ft0, fa0		# Число A
	mv	t0,  a0			# Число N	
	li 	t1,  1			# 10^N	    	
	beqz	t0,  .nzero
	li 	t3,  10
.loopn:	addi	t0,  t0, -1
	mul	t1,  t1, t3
	beqz	t0,  .nzero
	b	.loopn
.nzero: fcvt.d.w ft1, t1
	fmul.d	ft0, ft0, ft1		# A * 10^N
	fcvt.w.d t0, ft0, rtz
	fcvt.d.w ft0, t0
	fdiv.d	fa0, ft0, ft1
	lw      ra, (sp)
        addi    sp, sp, 4
	ret

